springboot 实现Http接口加签、验签操作 您所在的位置:网站首页 nginx 签名验证 springboot 实现Http接口加签、验签操作

springboot 实现Http接口加签、验签操作

2023-07-21 00:51| 来源: 网络整理| 查看: 265

运行环境

jdk8,springboot

业务背景:

服务之间接口调用,通过签名作为安全认证来保证API的安全性。

签名规则:

1、线下分配appid和appKey,

2、秘钥key+当前时间的毫秒+随机字符串 通过加密工具方法(如MD5,AES等)生成一个token,

3、加入timestamp(时间戳),10分钟内数据有效

4、加入signature,所有数据的签名信息。

传参说明:

只对业务所需的参数进行加密,其他参数在头部携带:

GET请求对url的参数进行加密,

POST请求对body体进行加密。

例如:

A服务调用B服务get请求接口: xxx/xx?a=1&b=2

对参数a=1&b=2进行加密得到sign

A服务http请求:

url=xxx/xx?a=1&b=2

header头部携带的参数

timestamp:时间戳

appid:appid

sign:签名

其他说明:

  Path:按照path中的顺序将所有value进行拼接

  Query:按照key字典序排序,将所有key=value进行拼接

  Form:按照key字典序排序,将所有key=value进行拼接

  Body:

    Json: 按照key字典序排序,将所有key=value进行拼接(例如{"a":"a","c":"c","b":{"e":"e"}} => a=ab=e=ec=c)

代码部分

pom.xml

com.google.code.gson gson     cn.hutool hutool-all 5.3.10 ConfigProperties

一般是接口费提供的。生成规则随意

在这种情况下,devId通常用作身份认证和授权的凭证。接口提供方会将有效的devId存储在数据库中以进行验证。当调用方发送请求时,接口提供方会验证请求中的devId是否有效,并核对数据库中存储的devId列表。如果devId有效,请求被认为是合法的,然后继续进行后续的处理。

使用devId作为凭证可以确保请求方具有被授权访问接口的权限。它可以用于验证调用方的身份和权限,以确保接口的安全性和合法性。

import java.util.HashMap; import java.util.Map; public class ConfigProperties { static Map map = null; static { if (map == null) { map = new HashMap(); map.put("devId1", "12345555"); map.put("devId2", "56789000"); map.put("devId3", "rt6356sr"); } } public Map getInvokeSystemMethodDevMap(String devId) { return map; } }

签名工具类

1.base64Utils

/** * Base64工具类 * * @author */ public final class Base64 { static private final int BASELENGTH = 128; static private final int LOOKUPLENGTH = 64; static private final int TWENTYFOURBITGROUP = 24; static private final int EIGHTBIT = 8; static private final int SIXTEENBIT = 16; static private final int FOURBYTE = 4; static private final int SIGN = -128; static private final char PAD = '='; static final private byte[] base64Alphabet = new byte[BASELENGTH]; static final private char[] lookUpBase64Alphabet = new char[LOOKUPLENGTH]; static { for (int i = 0; i < BASELENGTH; ++i) { base64Alphabet[i] = -1; } for (int i = 'Z'; i >= 'A'; i--) { base64Alphabet[i] = (byte) (i - 'A'); } for (int i = 'z'; i >= 'a'; i--) { base64Alphabet[i] = (byte) (i - 'a' + 26); } for (int i = '9'; i >= '0'; i--) { base64Alphabet[i] = (byte) (i - '0' + 52); } base64Alphabet['+'] = 62; base64Alphabet['/'] = 63; for (int i = 0; i > 2 ^ 0xc0); byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0); byte val3 = ((b3 & SIGN) == 0) ? (byte) (b3 >> 6) : (byte) ((b3) >> 6 ^ 0xfc); encodedData[encodedIndex++] = lookUpBase64Alphabet[val1]; encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k 2) : (byte) ((b1) >> 2 ^ 0xc0); encodedData[encodedIndex++] = lookUpBase64Alphabet[val1]; encodedData[encodedIndex++] = lookUpBase64Alphabet[k > 2) : (byte) ((b1) >> 2 ^ 0xc0); byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0); encodedData[encodedIndex++] = lookUpBase64Alphabet[val1]; encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k 2) & 0xf)); decodedData[encodedIndex++] = (byte) (b3 4); return tmp; } else if (!isPad(d3) && isPad(d4)) { b3 = base64Alphabet[d3]; if ((b3 & 0x3) != 0)// last 2 bits should be zero { return null; } byte[] tmp = new byte[i * 3 + 2]; System.arraycopy(decodedData, 0, tmp, 0, i * 3); tmp[encodedIndex++] = (byte) (b1 > 4); tmp[encodedIndex] = (byte) (((b2 & 0xf) > 2) & 0xf)); return tmp; } else { return null; } } else { // No PAD e.g 3cQl b3 = base64Alphabet[d3]; b4 = base64Alphabet[d4]; decodedData[encodedIndex++] = (byte) (b1 > 4); decodedData[encodedIndex++] = (byte) (((b2 & 0xf) > 2) & 0xf)); decodedData[encodedIndex++] = (byte) (b3


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有